//
//  SYDSRWebsocketManage.m
//  PinGJByOwnerSide
//
//  Created by lantaiyuan on 2017/9/8.
//  Copyright © 2017年 lantaiyuan. All rights reserved.
//

#import "SYDSRWebsocketManage.h"

@interface SYDSRWebsocketManage()

@end
@implementation SYDSRWebsocketManage

#pragma mark---初始化socket 与websocket建立连接
-(void)WithIP:(NSString *)URLIP{
    
    self.socket.delegate = nil;
    [self.socket close];
    self.socket = nil;
    
    NSString *urlStr = [NSString stringWithFormat:@"%@",URLIP];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //如需更改链接的头部则需此步
    self.socket = [[SRWebSocket alloc] initWithURLRequest:request];
    self.socket.delegate = self;
}

-(void)openSocket{
    //打开socket
    [self.socket open];
}
// Close WebSocket
-(void)closeSocket{
    
    self.socket.delegate = nil;
    [self.socket close];
    self.socket = nil;
}
-(void)sendTalkMessage:(NSDictionary *)message{
    
    [self sendMessage:message];
}

//send数据转化成json字符串
- (void)sendMessage:(NSDictionary *)messageDic {
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:messageDic options:NSJSONWritingPrettyPrinted error:&error];
    
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    
    [self.socket send:jsonString];
}

#pragma mark---SRWebSocketDelegate
//成功连接--打开socket后根据后端要求传入字典字符串
- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    
    //[self sendHeart];
    //每90秒发送一次心跳
    //  心跳间隔时间和心跳内容询问后台
    NSLog(@"Websocket Connected");
}
//接收服务器发送信息
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
    //NSLog(@"Received \"%@\"", message);
    NSData *jsonData = [message dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
    [self.delegate getMessageFromSocket:dic];
}
// 长连接关闭
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
    // 判断是何种情况的关闭，如果是人为的就不需要重连，如果是其他情况，就重连
    NSLog(@"WebSocket closed:%@",reason);
    //self.socket = nil;
}
//该函数是接收服务器发送的pong消息
/*其中最后一个是接受pong消息的，在这里就要提一下心跳包，一般情况下建立长连接都会建立一个心跳包，用于每隔一段时间通知一次服务端，客户端还是在线，这个心跳包其实就是一个ping消息，我的理解就是建立一个定时器，每隔十秒或者十五秒向服务端发送一个ping消息，这个消息可是是空的，例如
 NSData * data = [[NSData alloc]init];
 [_webSocket sendPing:data];
 发送过去消息以后，服务器会返回一个pong消息，这个消息是解读不了的，但是每次返回时就会调用-(void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload这个函数，如果要用到话，可以像我做的那样，直接在该函数里面统计一下收到的次数，跟发送的次数比较，如果每次发送之前，自己发送的ping消息的个数，跟收到pong消息的个数相同，那就代表一直在连接状态，但是服务器发送pong消息时候是自动发送的，服务器是看不到客户端发送的ping消息的，同理，服务端也一样，只要服务端建立有心跳连接，那么服务端也是一直在发送ping消息，客户端一直在回复pong消息，这两个消息是处理不了的，没办法解读这个歌消息体里面的内容。还有一点就是在发送ping消息的时候，如果非要想在里面加入一些参数，这个参数不能太大，太大的话，会提示发送失败*/
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload {
    NSString *reply = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding];
    NSLog(@"%@",reply);
}
//连接失败，打印错误信息
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
    NSLog(@":( Websocket Failed With Error %@", error);
    self.socket = nil;
}

// 发送心跳
-(void)sendHeart{
    NSString *heartBeat = @"心跳";
    @try {
        [self.socket send:heartBeat];
    } @catch (NSException *exception) {
        //  发送心跳出错
        [self WithIP:[NSString stringWithFormat:@"ws://10.1.10.28:8070/websocket?userId=%@",[YMSaveTool valueForKey:USER_ID]]];
    } @finally {
    }
}
@end



